/*************************************************
  * 描述：异常处理基类
  *
  * File：exception.h
  * Author：dongyao@mozihealthcare.cn
  * Date：2025/9/23
  * Update：
  * ************************************************/

#ifndef EXCEPTION_H
#define EXCEPTION_H
#include <QString>
#include <common/export.h>
namespace ErrorCode
{
	static const int BASE_ERROR = 0;            // 基础错误码
	static const int STD_ERROR_BASE = 1000;     // 标准库相关异常基础码
	static const int RUNNING_ERROR_BASE = 2000; // 运行时异常基础码
	static const int NETWORK_ERROR_BASE = 2100; // 网络相关异常基础码
	static const int FILE_ERROR_BASE = 2200;    // 文件操作相关异常基础码
	static const int DATABASE_ERROR_BASE = 2300;// 数据库相关异常基础码
	static const int UI_ERROR_BASE = 3000;      // UI相关异常基础码
}// namespace ErrorCode
class CXI_COMMON_EXPORT Exception : public std::exception
{
public:
	/**
	 * 基类构造函数
	 * @param message 错误信息
	 * @param code 类型代码
	 */
	Exception(const QString& message, int code = ErrorCode::BASE_ERROR);

	// 析构函数
	~Exception() override = default;

	// 返回错误消息的C风格字符串
	const char* what() const noexcept override;

	// 返回错误消息（QString）
	QString message() const;

	// 返回错误代码
	int code() const;

	// 返回异常类型名称
	virtual QString type() const;

protected:
	QString m_message;              // 错误消息
	int m_code;                     // 错误代码
	mutable QByteArray m_whatBuffer;// 用于what()函数的缓存
};
/**
 * 标准库异常
 */
class CXI_COMMON_EXPORT StdException : public Exception
{
public:
	StdException(const QString& message, int code = ErrorCode::STD_ERROR_BASE);
	QString type() const override;
};
/**
 * 运行时异常
 */
class CXI_COMMON_EXPORT RunningException : public Exception
{
public:
	RunningException(const QString& message, int code = ErrorCode::RUNNING_ERROR_BASE);
	QString type() const override;
};

/**
 * 网络相关异常
 */
class CXI_COMMON_EXPORT NetworkException : public RunningException
{
public:
	NetworkException(const QString& message, int code = ErrorCode::NETWORK_ERROR_BASE);
	QString type() const override;
};

/**
 * 文件操作相关异常
 */
class CXI_COMMON_EXPORT FileException : public RunningException
{
public:
	FileException(const QString& message, int code = ErrorCode::FILE_ERROR_BASE);
	QString type() const override;
};

/**
 * 数据库相关异常
 */
class CXI_COMMON_EXPORT DatabaseException : public RunningException
{
public:
	DatabaseException(const QString& message, int code = ErrorCode::DATABASE_ERROR_BASE);
	QString type() const override;
};

/**
 * UI相关异常
 */
class CXI_COMMON_EXPORT UiException : public Exception
{
public:
	UiException(const QString& message, int code = ErrorCode::UI_ERROR_BASE);

	QString type() const override;
};
#endif//EXCEPTION_H
